package main

import (
	"strconv"

	"github.com/gin-gonic/gin"
	"gopkg.in/mgo.v2/bson"
)

func EleRouterInit(r *gin.Engine) {
	r.POST("/ele/create", CreateEleApi)  // 创建Ele
	r.GET("/ele/get", GetEleApi)         // 获取Ele
	r.POST("/ele/update", UpdateEleApi)  // 更新Ele
	r.GET("/ele/delete", DeleteEleApi)   // 删除Ele
	r.GET("/ele/list", GetElesByBookApi) // 获取书籍的所有Ele
	r.POST("/ele/search", SearchElesApi) // 搜索Ele
}

// 创建Ele
func CreateEleApi(c *gin.Context) {
	var ele Ele
	if err := c.ShouldBindJSON(&ele); err != nil {
		Error(c, 1, err.Error())
		return
	}
	err := CreateEle(&ele)
	if err != nil {
		Error(c, 1, "创建失败")
		return
	}
	Success(c, ele)
}

// 获取单个Ele
func GetEleApi(c *gin.Context) {
	id := c.Query("id")
	ele, err := GetEle(id)
	if err != nil {
		Error(c, 1, "Ele not found")
		return
	}
	Success(c, ele)
}

// 更新Ele
func UpdateEleApi(c *gin.Context) {
	var updateData map[string]interface{}
	if err := c.ShouldBindJSON(&updateData); err != nil {
		Error(c, 1, err.Error())
		return
	}

	id, ok := updateData["id"].(string)
	if !ok {
		Error(c, 1, "Invalid ele ID")
		return
	}
	delete(updateData, "id")     // 从更新数据中移除ID
	delete(updateData, "bookId") // 从更新数据中移除BookId
	switch v := updateData["status"].(type) {
	case float64:
		updateData["status"] = int(v)
	case string:
		updateData["status"], _ = strconv.Atoi(v)
	default:
		updateData["status"] = 0
	}
	err := UpdateEle(id, updateData)
	if err != nil {
		Error(c, 1, "更新失败")
		return
	}
	Success(c, gin.H{"id": id})
}

// 删除Ele
func DeleteEleApi(c *gin.Context) {
	id := c.Query("id")
	err := DeleteEle(id)
	if err != nil {
		Error(c, 1, err.Error())
		return
	}
	Ok(c)
}

// ... 已有代码 ...

// 分页获取书籍的所有Ele
func GetElesByBookApi(c *gin.Context) {
	bookID := c.Query("bookId")
	page := c.DefaultQuery("page", "1")
	pageSize := c.DefaultQuery("pageSize", "10")

	if !bson.IsObjectIdHex(bookID) {
		Error(c, 1, "Invalid book ID")
		return
	}

	// 转换分页参数为整数
	pageInt, err := strconv.Atoi(page)
	if err != nil || pageInt < 1 {
		pageInt = 1
	}

	pageSizeInt, err := strconv.Atoi(pageSize)
	if err != nil || pageSizeInt < 1 {
		pageSizeInt = 10
	}

	eles, err := GetElesByBook(bookID, pageInt, pageSizeInt)
	if err != nil {
		Error(c, 1, err.Error())
		return
	}

	// 获取总数用于分页
	total, err := GetElesCountByBook(bookID)
	if err != nil {
		Error(c, 1, err.Error())
		return
	}

	SuccessPage(c, eles, total, pageInt, pageSizeInt)
}

func SearchElesApi(c *gin.Context) {
	var ele Ele

	err := c.ShouldBindJSON(&ele)
	if err != nil {
		Error(c, 1, err.Error())
		return
	}

	eles, err := SearchEles(ele)
	if err != nil {
		Error(c, 1, err.Error())
		return
	}

	Success(c, gin.H{"list": eles})
}

// ... 已有代码 ...
